home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / FRMSQT.SA < prev    next >
Text File  |  1987-03-04  |  13KB  |  479 lines

  1. *
  2.     NAM  FRMSQT
  3.     TTL  FLOATING-POINT REMAINDER ROUTINE
  4. *
  5. *    DEFINE EXTERNAL REFERENCES
  6. *
  7.   XDEF    FREM,FSQRT,SQINCK
  8. *
  9.   XREF    VALID,NORM1,NORMQK,FADD,XSUBY
  10.   XREF    TFRACT,RTNAN,ROUND,FRCTAB,BITTBL
  11.   XREF    FPMOVE,DNORM1,SHIFTR,IOPSUB,RTAR2
  12. *
  13. *
  14. *    REVISION HISTORY:
  15. *      DATE       PROGRAMMER        REASON
  16. *
  17. *    23.MAY.80       G.WALKER        ORIGINAL
  18. *    1.JULY.80       G.WALKER        CODE COMPACTION
  19. *    17.JUL.80       G.WALKER        MORE CODE SHRINK
  20. *                      AND IOP SUBR.
  21. *    18.JUL.80       G.WALKER        ADD 'SQINCK' BY G.S.
  22. *    07.AUG.80       G. STEVENS        FIX GT TO GE IN SQINCK
  23. *    15.OCT.80       G.WALKER        FIX CALL TO TFRACT IN FSQRT
  24. *    17.DEC.80       G.WALKER        DO FINAL FPADD IN EXTENDED PREC.
  25. *
  26.     PAG
  27. ****************************************************
  28. *
  29. *    FPREM --
  30. *     THIS ROUTINE CALCULATES THE REMAINDER OF
  31. *    ARG1 / ARG2.  THE OPERATION IS DEFINED BY:
  32. *     RESULT = ARG1 - ARG2*N
  33. *    WHERE N IS THE INTEGER NEAREST ARG1/ARG2 AND
  34. *    N IS EVEN IF ABS(N - ARG1/ARG2) = 1/2. (I.E.
  35. *    IT IS A TIE WHICH WAY TO ROUND)
  36. *
  37. *     THE ACTUAL ALGORITHM USED TO FIND THE REMAINDER
  38. *    INVOLVES CALCULATING ALL THE INTEGER BITS OF
  39. *    THE RESULT IN A 'FUNNY DIVISION' LOOP.  THE
  40. *    DIVIDEND LEFT OVER IS THE RAW REMAINDER, I.E.
  41. *    THE REMAINDER OBTAINED BY TRUNCATION.  THE NUMBER
  42. *    OF INTEGER BITS IN THE RESULT, WHICH IS THE
  43. *    NUMBER OF DIVISION ITERATIONS THAT MUST BE
  44. *    PERFORMED, IS OBTAINED FROM THE DIFFERENCE IN
  45. *    EXPONENTS OF THE TWO ARGUMENTS.
  46. *     THE ACTUAL REMAINDER IS OBTAINED BY SIMULATING
  47. *    A 'ROUND TO NEAREST' OPERATION ON THE QUOTIENT.
  48. *    IF THE RAW REMAINDER IS LESS THAN HALF THE DIVISOR, THE
  49. *    RESULT IS THE RAW REMAINDER.  IF THE RAW REMAINDER IS
  50. *    GREATER THAN HALF THE DIVISOR, THE DIVISOR IS
  51. *    SUBTRACTED ONCE MORE FROM THE RAW REMAINDER TO GIVE THE
  52. *    RESULT.  IF THE RAW REMAINDER IS EQUAL TO HALF THE DIVISOR,
  53. *    THEN THE SUBTRACTION IS PERFORMED ONLY IF THE LAST
  54. *    BIT OF THE QUOTIENT WAS A ONE (WAS ODD).
  55. *
  56. *    LOCAL STORAGE:
  57. *      FRCNDX (0) -- LARGEST INDEX INTO FRACTION
  58. *      VBIT (1)   -- CARRY OUT OF HIGH-ORDER DIVIDEND
  59. *      LSTBIT (2) -- LAST BIT OF INTEGER QUOTIENT GENERATED
  60. *      BITCNT (3) -- 2-BYTE COUNT OF QUOTIENT BITS GENERATED
  61. *
  62. FRCNDX SET 0
  63. VBIT   SET 1
  64. LSTBIT SET 2
  65. BITCNT SET 3
  66. *
  67. *
  68. FREM EQU *
  69.   LEAS -5,S    RESERVE LOCAL STORAGE
  70.   LDA  RPREC,U
  71.   LSRA
  72.   LEAX FRCTAB,PCR  GET LARGEST INDEX TO FRACTION
  73.   LDB  A,X
  74.   DECB           CHANGE BYTE COUNT TO INDEX
  75.   STB  FRCNDX,S
  76. *
  77. *    CREATE COUNT OF INTEGER BITS IN QUOTIENT
  78. *    AS DIFFERENCE OF ARGUMENT EXPONENTS + 1.
  79. *
  80.   LDD  EXP1,U
  81.   SUBD EXP2,U
  82.   ADDD #1
  83.   STD  BITCNT,S
  84. *
  85. *    CREATE POINTERS TO ARGUMENT FRACTIONS
  86. *
  87.   LEAX FRACT1,U
  88.   LEAY FRACT2,U
  89. *
  90. *     DIVIDE ARG1 BY ARG2, GENERATING ALL THE INTEGER
  91. *    QUOTIENT BITS (WHICH MAY BE A LARGE NUMBER OF THEM!!).
  92. *    ONLY THE MOST RECENTLY GENERATED BIT IS SAVED.  EACH
  93. *    TIME THE DIVIDEND IS LEFT SHIFTED, ITS EXPONENT IS
  94. *    DECREMENTED BY ONE TO SO THAT THE VALUE OF THE
  95. *    DIVIDEND IS NOT CHANGED BY THE SHIFT.
  96. *
  97.   CLR  VBIT,S    NO INITIAL CARRY
  98.   CLR  LSTBIT,S   INITIALLY CLEAR QUOTIENT
  99. *            COUNT OF QUOTIENT BITS IS IN D-REG
  100.   WHILE D,GT,#0        LOOP TO GENERATE QUOTIENT BITS
  101.     IFTST (VBIT,S),EQ,#0     IF CARRY OUT IS ZERO
  102.       CLRA             COMPARE FRACTIONS
  103.       LDB A,X
  104.       WHILE B,EQ,(A,Y)       UNLESS BYTES ARE UNEQUAL
  105.     CMPA  FRCNDX,S        IF ALL BYTES COMPARED, ARE EQUAL
  106.     BGE   FRMSUB           SO DO SUBTRACT
  107.     INCA          NEXT BYTE
  108.     LDB A,X       FOR COMPARISON
  109.       ENDWH
  110. *
  111. *     IF IT FELL OUT OF THE LOOP, THE THE CC REGISTER
  112. *    TELLS THE RESULT OF THE COMPARISON.
  113. *
  114.       BHI  FRMSUB      DIVISOR WAS SMALLER, SO SUBTRACT
  115.       CLR  LSTBIT,S    ELSE GENERATE 0 QUOTIENT BIT
  116.       BRA  FRMSHF     AND NO SUBTRACT
  117.     ENDIF        CARRY OUT IS EQUAL ZERO
  118. *
  119. *     GENERATE A QUOTIENT BIT OF '1' AND SUBTRACT THE
  120. *    DIVISOR FROM THE DIVIDEND.
  121. *
  122. FRMSUB EQU *
  123.     LDA  #1
  124.     STA  LSTBIT,S   GENERATE A 1 AS QUOTIENT BIT
  125.     LBSR XSUBY        SUBTRACT DIVISOR FROM DIVIDEND
  126. *
  127. *     NOW SHIFT THE DIVIDEND FRACTION TO THE
  128. *    LEFT ONE BIT, SAVING BIT SHIFTED OUT OF THE
  129. *    MSBYTE IN 'VBIT'.  ALSO ADJUST QUOTIENT
  130. *    BIT MASK TO GENERATE THE NEXT BIT.
  131. *
  132. FRMSHF EQU *
  133.    CLRA       CLEAR CARRY
  134.    LSHIFT   0,X,9  SHIFT DIVIDEND LEFT
  135.    LDB    #0
  136.    ROLB      SAVE CARRY OUT
  137.    STB    VBIT,S
  138.    LDD    EXP1,U        DECREMENT EXPONENT TO COMPENSATE
  139.    SUBD #1        FOR LEFT SHIFT
  140.    STD    EXP1,U
  141.    LDD    BITCNT,S    COUNT OF BITS GENERATED
  142.    SUBD #1
  143.    STD    BITCNT,S
  144.   ENDWH      END LOOP TO GENERATE BINARY QUOTIENT
  145. *
  146. *     IF THE OVERFLOW BIT (VBIT) IS SET, THEN
  147. *    SHIFT IT RIGHT INTO ARG1 TO ALLOW COMPARISON
  148. *    BETWEEN ARG1 AND ARG2.
  149. *
  150.    LDB    VBIT,S
  151.    IFCC  NE
  152.     RORB           PUT VBIT IN CARRY
  153.     LEAX  -FRACT,X     POINT TO FRACTION OF ARG1
  154.     LBSR  DNORM1
  155.     LEAX  FRACT,X      POINT TO ALL OF ARG1
  156.    ENDIF
  157. *
  158. *     IF THE REMAINDER (NOW IN ARG1) IS LESS
  159. *    THAN HALF THE DIVISOR, THEN IT IS RETURNED
  160. *    UNCHANGED AS THE RESULT.  IF THE REMAINDER
  161. *    IS GREATER THAN HALF THE DIVISOR, THEN
  162. *    THE DIVISOR IS SUBTRACTED FROM IT ONE MORE
  163. *    TIME.  IF THE REMAINDER IS EQUAL TO HALF THE
  164. *    DIVISOR, THEN THE SUBTRACTION IS PERFORMED
  165. *    ONLY IF THE LAST INTEGER BIT IS A 1, I.E.
  166. *    ROUND TO EVEN OF THE QUOTIENT IS SIMULATED.
  167. *
  168.    LDD    EXP-FRACT,Y    GET EXPONENT OF ARG2
  169.    SUBD #1
  170.    IF  D,GE,(EXP-FRACT,X)   COMPARE TO EXP OF PARTIAL REM
  171.      BGT  RMNOSB     HALF REM GT DIVISOR, SO NO SUBTR.
  172.       CLRA         ELSE COMPARE FRACTIONS
  173.       LDB  A,X
  174.       WHILE  B,EQ,(A,Y)
  175.        IF A,GE,(FRCNDX,S)
  176.     TST  LSTBIT,S
  177.     BNE  RMSUB     ROUND IF REM IS ODD
  178.     BRA  RMNOSB    DONT ROUND IF EVEN
  179.        ENDIF         WE HAVE COMPARED ALL BYTES
  180.        INCA
  181.        LDB  A,X
  182.       ENDWH
  183. *
  184. *    CC REG TELLS RESULT OF COMPARE IF THEY ARE
  185. *    NOT EQUAL.
  186. *
  187.       BLO  RMNOSB    IF REM IS LESS, DONT SUBTRACT
  188.     ENDIF       DIVISOR EXP. IS LESS
  189. *
  190. RMSUB  EQU  *
  191.     LDA  SIGN-FRACT,X         SET DIVISOR (ARG2) SIGN TO OPPOSITE
  192.     EORA #$80           OF DIVIDEND (ARG1) SIGN
  193.     STA  SIGN-FRACT,Y
  194.     LDA  RPREC,U       SAVE CURRENT ROUNDING MODE
  195.     PSHS A
  196.     LDA  #EXT           SET MODE TO EXTENDED (TO AVOID
  197.     STA  RPREC,U      SINGLE OR DOUBLE UNDERFLOW)
  198.     LBSR  FADD         SUBTRACT DIVISOR FROM RAW REMAINDER
  199.     PULS    A          RESTORE OLD ROUNDING MODE
  200.     STA     RPREC,U
  201.     BRA   RMEND
  202. *
  203. RMNOSB    EQU *
  204.     LEAY RESULT,U    MOVE RAW REMAINDER TO RESULT
  205.     LEAX ARG1,U
  206.     LBSR  FPMOVE
  207. *
  208. RMEND  EQU  *
  209. *
  210. *    NORMALIZE RESULT, IF NEEDED
  211. *
  212.   LEAX RESULT,U
  213.   LBSR    NORMQK        PERFORM MULTI-BIT NORMALIZE
  214. *
  215. *     CHECK FOR EXCEPTIONS AND ROUND RESULT
  216. *
  217.   LBSR VALID        VALIDATE RESULT
  218. *
  219. *     CLEAN UP STACK AND SPLIT
  220. *
  221.   LEAS 5,S
  222.   RTS
  223.   TTL  FLOATING-POINT SQUARE ROOT ROUTINE
  224.   PAG
  225. **************************************************
  226. *
  227. *    FSQRT --
  228. *     CALCULATES SQUARE ROOT OF ARG2 ON THE STACK,
  229. *    LEAVING IT IN THE RESULT.    THE ALGORITHM IS
  230. *    FROM:
  231. *     DAVID M. YOUNG AND R.T. GREGORY.  A SURVEY
  232. *     OF NUMERICAL MATHEMATICS. VOL 1 (READING, MASS.:
  233. *     ADDISON-WESLEY), 1972, PP. 61-62.
  234. *
  235. *    THE ALGORITHM FOR TAKING THE SQUARE ROOT OF THE
  236. *    BINARY FRACTION MAY BE FOUND IN:
  237. *     HANS W. GESCHWIND AND EDWARD J. MCCLUSKEY.
  238. *    DESIGN OF DIGITAL COMPUTERS. (NEW YORK: SPRINGER-
  239. *    VERLAG), 1975, PP. 293-301.
  240. *
  241. *    LOCAL STORAGE:
  242. *     FRCNDX (0) -- LARGEST INDEX TO BYTE IN FRACTION
  243. *     FRBITS (1) -- NO. BITS IN FRACTION OF THIS PRECISION
  244. *     BITCNT (2) -- COUNTER FOR RESULT BITS GENERATED
  245. *     VBIT    (3) -- HIGH-ORDER BIT OF ARG2.
  246. *     RSLBIT (4) -- BIT MASK FOR RESULT BIT TO BE GENERATED
  247. *     RSLNDX (5) -- INDEX OF BYTE FOR NEXT RESULT BIT
  248. *     TSTBIT (6) -- BIT MASK TO CREATE TEST VALUE BIT
  249. *     TSTNDX (7) -- BYTE INDEX WHERE TO CREATE TEST BIT
  250. *
  251. *****
  252. *
  253. FRCNDX SET 0
  254. FRBITS SET 1
  255. BITCNT SET 2
  256. VBIT   SET 3
  257. RSLBIT SET 4
  258. RSLNDX SET 5
  259. TSTBIT SET 6
  260. TSTNDX SET 7
  261. *
  262. FSQRT EQU *
  263.   IFTST (ARG2,U),NE,#0
  264.    IOP 1       RETURN INVALID OP OF 1
  265.   ELSE    L     ARG NOT NEG, TAKE SQRT
  266. *
  267. *    INITIALIZE LOCAL STORAGE
  268. *
  269.    LEAS -8,S
  270.    LEAX  FRCTAB,PCR
  271.    LDA     RPREC,U
  272.    LSRA
  273.    LDB     A,X
  274.    DECB
  275.    STB     FRCNDX,S      INIT. LARGEST BYTE INDEX
  276.    LEAX  BITTBL,PCR
  277.    LDB     A,X
  278.    STB     FRBITS,S      INIT. NUMBER OF RESULT BITS
  279. *
  280. *     CALCULATE SQUARE ROOT OF EXPONENT BY MAKING
  281. *    IT EVEN AND THEN DIVIDING IT IN HALF.  IF EXPONENT
  282. *    IS ODD, INCREMENT IT AND DENORMALIZE THE FRACTION
  283. *    ONE BIT TO THE RIGHT SO THAT THE ARGUMENT IS NOT
  284. *    CHANGED IN VALUE.
  285. *
  286. *
  287.    LEAX FRACT2,U     POINT TO ARGUMENT
  288.    LEAY FRACTR,U     POINT TO RESULT
  289. *
  290.    LDD    EXP2,U
  291.    LSRA        DIVIDE EXPONENT BY 2
  292.    RORB
  293.    IFCC CS      IF EXPONENT WAS ODD
  294.     ADDD #1       INCR IT SO IS EVEN
  295.     ANDCC #$FE        SHIFT 0 INTO FRACTION
  296.     LBSR  SHIFTR     FROM THE LEFT
  297.    ENDIF
  298.    STD    EXPR,U      SAVE SQRT OF EXPONENT
  299. *
  300. *     LOOP TO CALCULATE THE SQUARE ROOT OF THE
  301. *    FRACTION, GENERATING ONE BIT OF THE RESULT FOR
  302. *    EACH INTERATION.  THE OPERATION IS SIMILAR TO
  303. *    A BINARY DIVISION, EXCEPT THAT THE PARTIAL
  304. *    RESULT IS ITSELF USED AS THE TEST DIVISOR.
  305. *     THE TEST RESULT IS CREATED BY SETTING THE
  306. *    BIT WHICH IS ONE PLACE TO THE RIGHT OF THE
  307. *    BIT ABOUT TO BE GENERATED.  AFTER THE TEST
  308. *    AND SUBTRACTION (IF ANY) IS PERFORMED, THE
  309. *    TEST BIT IS REMOVED AND THE PROPER QUOTIENT
  310. *    BIT IS INSERTED INTO THE RESULT.  THEN THE
  311. *    ARGUMENT IS SHIFTED ONE PLACE TO THE LEFT, AND
  312. *    THE QUOTIENT AND TEST BIT MASKS ARE MOVED ONE
  313. *    BIT TO THE RIGHT.
  314. *     WHEN ALL FRACTION BITS HAVE BEEN GENERATED,
  315. *    THE RESULT IS ROUNDED.
  316. *
  317.    LDA #$80
  318.    STA    RSLBIT,S     INIT. RESULT BIT MASK
  319.    LSRA
  320.    STA    TSTBIT,S    INIT. TEST BIT MASK
  321.    CLRA
  322.    STA    RSLNDX,S    INIT. RESULT BYTE INDEX
  323.    STA    TSTNDX,S    INIT. TEST BYTE INDEX
  324.    STA    VBIT,S        INIT. OVERFLOW BIT
  325. *
  326. *     ALIGN ARGUMENT FRACTION WITH RESULT
  327. *    RADIX POINT.
  328. *
  329.    CLRA         CLEAR CARRY BIT
  330.    LBSR  SHIFTR
  331. *
  332. *    NOW LOOP THE LOOP.
  333. *
  334.    CLRA
  335.    STA    BITCNT,S
  336.    WHILE A,LE,(FRBITS,S)
  337.     LDA  TSTNDX,S
  338.     LDB  TSTBIT,S
  339.     ORB  A,Y          CREATE TEST VALUE
  340.     STB  A,Y
  341. *
  342. *     COMPARE TEST VALUE TO ARGUMENT.  IF TEST
  343. *    IS SMALLER OR EQUAL,  SUBTRACT THE TEST VALUE
  344. *    FROM THE ARGUMENT AND GENERATE A 1 BIT IN
  345. *    THE RESULT.  OTHERWISE GENERATE A 0 BIT IN
  346. *    THE RESULT.
  347. *
  348.     TST  VBIT,S       VBIT=1 MEANS ARGUMENT LARGER
  349.     BNE  FSQSUB           SO DO SUBTRACTION
  350. *
  351.     CLRA
  352.     LDB  A,Y          FIRST BYTE OF RESULT
  353.     WHILE B,EQ,(A,X)
  354.      CMPA  FRCNDX,S    IF DIVIDEND EQUALS TEST VALUE
  355.      BGE   FSQSUB       DO SUBTRACTION
  356.      INCA
  357.      LDB  A,Y
  358.     ENDWH
  359. *
  360. *     IF CONTROL FELL OUT OF THE LOOP, THEN
  361. *    ARGUMENT IS NOT EQUAL TO RESULT AND THE
  362. *    CC REGISTER TELLS THE COMPARISON.
  363. *
  364.     BLO  FSQSUB      SUBTRACT IF RESULT IS SMALLER
  365. *
  366.     BRA  FSQSHF        AND GO DO SHIFT TO LEFT
  367. *
  368. *
  369. FSQSUB EQU *
  370.     LBSR  XSUBY      SUBTRACT TEST FROM 'DIVIDEND'
  371. *
  372.     LDB  RSLNDX,S
  373.     LDA  RSLBIT,S
  374.     ORA  B,Y         INSERT 1 AS RESULT BIT
  375.     STA  B,Y
  376. *
  377. *     SHIFT ARGUMENT LEFT BY ONE BIT AND
  378. *    AJDUST MASKS FOR THE TEST AND RESULT BITS.
  379. *
  380. FSQSHF EQU *
  381.     LDA  TSTBIT,S
  382.     LDB  TSTNDX,S     REMOVE TEST BIT
  383.     COMA
  384.     ANDA B,Y
  385.     STA  B,Y
  386.     CLRA         CLEAR CARRY BIT
  387.     LSHIFT  0,X,9     SHIFT ARG LEFT
  388.     LDB #0
  389.     RORB
  390.     STB  VBIT,S     SAVE HIGH-ORDER BIT
  391. *
  392.     CLRA           CLEAR CARRY
  393.     ROR  RSLBIT,S   MOVE TO NEXT QUOTIENT BIT
  394.     IFCC CS
  395.      ROR RSLBIT,S
  396.      INC RSLNDX,S    MOVE TO NEXT QUO BYTE
  397.     ENDIF
  398.     CLRA           CLEAR CARRY
  399.     ROR  TSTBIT,S     MOVE TO NEXT TEST BIT
  400.     IFCC CS
  401.      ROR  TSTBIT,S    MOVE TO NEXT TEST BYTE
  402.      INC  TSTNDX,S
  403.     ENDIF
  404.     INC  BITCNT,S
  405.     LDA  BITCNT,S
  406.    ENDWH          LOOP TO GENERATE RESULT BITS
  407. *
  408. *     SET STICKY BYTE NONZERO IF ARGUMENT
  409. *    IS STILL NON ZERO.
  410. *
  411.    LDB    FRCNDX,S
  412.    INCB
  413.    LEAX  -FRACT,X    POINT TO ENTIRE INPUT ARGUMENT
  414.    LBSR TFRACT         TEST ARG FRACTION FOR ZERO
  415.    IFCC NE         AND SET STICKY <> 0 IF THERE
  416.       INC  STIKY,U     ARE ANY ONE BITS LEFT IN ARGUMENT
  417.    ENDIF
  418.    LEAS 8,S       REMOVE LOCAL STORAGE
  419. *
  420. *     NORMALIZE RESULT LEFT ONE BIT IF NEEDED.
  421. *
  422.    LEAX  RESULT,U
  423.    LDA    FRACT,X
  424.    IFCC GE       IF MSB NOT SET
  425.     LBSR  NORM1        NORM. RESULT
  426.    ENDIF
  427. *
  428. *
  429.    LBSR ROUND       ROUND TO APPROPRIATE PREC.
  430. *
  431.   ENDIF     END CALCULATE FOR POS NUMBERS
  432. *
  433.   RTS
  434. *
  435. *********************************************************
  436. *
  437. *    SQINCK --
  438. *     CHECKS INFINTIES AGAINST THE AFFINE AND
  439. *    PROJECTIVE CLOSURE MODES WHEN PERFORMING A SQUARE
  440. *    ROOT OPERATION.
  441. *
  442. *    ON ENTRY:
  443. *     U -- STAK FRAME POINTER.
  444. *
  445. *    ON EXIT:
  446. *     RESULT ON STACK FRAME CONTAINS EITHER ARG2 OR
  447. *         A NAN.
  448. *     U UNCHANGED.
  449. *     CC, D, X, Y ARE DESTROYED.
  450. *
  451. SQINCK EQU *
  452.   LDA  [PFPCB,U]       CHECK INFINITY CLOSURE MODE
  453.   ANDA #CTLAFF
  454. *
  455. *     IF PROJECTIVE MODE THEN SIGNAL IOP=1 AND RETURN
  456. *    A NAN.
  457. *
  458.   IFCC    EQ
  459.     IOP 1
  460. *
  461. *     ELSE IN AFFINE MODE, IF ARG2 IS +INFINITY
  462. *    RETURN ARG2.
  463. *
  464.   ELSE
  465.     LDA  SIGN2,U
  466.     IFCC GE          IF IT IS +
  467.       LBSR RTAR2      RETURN ARG2
  468. *
  469. *     ELSE IN AFFINE MODE, IF ARG2 IS -INF. SIGNAL
  470. *    IOP=1 AND RETURN A NAN.
  471. *
  472.     ELSE
  473.       IOP  1
  474.     ENDIF
  475.   ENDIF
  476. *
  477.   RTS
  478. *
  479.